#include "input_paral_fun_MR.h"

int get_token_of_input_paral_fun_MR(struct input_paral_MR_context *mr_ctx)
{
    // 首先处理数字
    static int LastChar = ' ';

    //跳过所有空格
    while (LastChar == ' ' || LastChar == '\v' || LastChar == '\t')
    {
        LastChar = get_char(mr_ctx);
    }

    if (LastChar == '\r')
    {
        printf("CR is not supported\n");
        exit(-1);
    }

    // 遇到回车看tab
    while (LastChar == '\n')
    {
        LastChar = get_char(mr_ctx);
        int tab_size = 0;
        while (LastChar == '\t')
        {
            tab_size++;
            LastChar = get_char(mr_ctx);
        }

        // 记录tab的数量
        mr_ctx->tab_size = tab_size;

        // printf("发现tab:%d\n", tab_size);

        return paral_py_language_tok_tab;
    }

    // 引号开头，作为变量返回
    if (LastChar == '"')
    {
        mr_ctx->identifier_str = LastChar;

        LastChar = get_char(mr_ctx);

        // 碰到下一个引号时，返回这一变量
        while (LastChar != '"')
        {
            mr_ctx->identifier_str += LastChar;
            LastChar = get_char(mr_ctx);
        }

        // 处理最后一个引号
        mr_ctx->identifier_str += LastChar;
        LastChar = get_char(mr_ctx);

        // 返回类型
        return paral_py_language_tok_var;
    }

    // 数字开头，处理为double和int
    if (isdigit(LastChar) || LastChar == '-')
    {
        mr_ctx->identifier_str = LastChar;

        LastChar = get_char(mr_ctx);

        bool is_int = 1;

        while (isdigit(LastChar) || LastChar == '.')
        {
            if (LastChar == '.')
            {
                if (is_int == 0)
                {
                    printf("error in num\n");
                    exit(-1);
                }
                else
                {
                    is_int = 0;
                }
            }

            mr_ctx->identifier_str += LastChar;
            LastChar = get_char(mr_ctx);
        }

        // 完整获得一个数字
        return paral_py_language_tok_var;
    }

    // 字母开头
    if (isalpha(LastChar))
    {
        mr_ctx->identifier_str = LastChar;

        LastChar = get_char(mr_ctx);

        // 一般的语元
        while (isalnum(LastChar) || LastChar == '_')
        {
            mr_ctx->identifier_str += LastChar;
            LastChar = get_char(mr_ctx);
        }

        // 查看是不是保留字
        int i;
        for (i = 0; i < mr_ctx->remain_str_arr.size(); i++)
        {
            if (mr_ctx->identifier_str == mr_ctx->remain_str_arr[i])
            {
                // printf("发现保留字:%s\n", mr_ctx->identifier_str.c_str());
                return paral_py_language_tok_gramma;
            }
        }

        // 查看是不是函数
        if (mr_ctx->fun_table.count(mr_ctx->identifier_str) > 0)
        {
            struct function_table_item item;
            memset(&item, 0, sizeof(struct function_table_item));

            item = mr_ctx->fun_table[mr_ctx->identifier_str];

            if (item.function_type != tok_seq_def_type && item.function_type != tok_seq_comm_assoca_def_type)
            {
                // if(mr_ctx->identifier_str != mr_ctx->){
                // printf("not support paral op in paral op:%d\n", item.function_type);
                // exit(-1);
                // }
            }

            // 输出算子类型
            return paral_py_language_tok_op;
        }

        // 查看是不是有中括号，扩展的变量
        if (LastChar == '[')
        {
            mr_ctx->identifier_str += LastChar;
            LastChar = get_char(mr_ctx);

            // 中括号中间的内容不去想
            while (LastChar != ']')
            {
                mr_ctx->identifier_str += LastChar;
                LastChar = get_char(mr_ctx);
            }

            // 把括号算进去
            mr_ctx->identifier_str += LastChar;
            LastChar = get_char(mr_ctx);
        }

        // 不是保留字
        return paral_py_language_tok_var;
    }

    // 发下括号逗号冒号
    if (LastChar == '(' || LastChar == ')' || LastChar == ':' || LastChar == ',')
    {
        // printf("括号冒号逗号\n");
        mr_ctx->identifier_str = LastChar;
        LastChar = get_char(mr_ctx);
        return paral_py_language_tok_gramma;
    }

    // 等号是运算符
    if (LastChar == '=')
    {
        // printf("等号\n");
        mr_ctx->identifier_str = LastChar;
        LastChar = get_char(mr_ctx);

        return paral_py_language_tok_op;
    }

    // 读到最后没有了，返回eof
    if (LastChar == NULL)
    {
        // 复位
        LastChar = ' ';
        return paral_py_language_tok_eof;
    }

    return paral_py_language_tok_unknow;
}